package tp.pr5.mv;

	// La vista del modo Interactivo se encarga de escribir todo en pantalla durante la ejecución en este modo.

public class InteractiveView extends CPUObserverHelper {
	
	@Override
	public void onStartInstrExecution(Instruction ins) {

		System.out.println( "Comienza la ejecución de " + ins.toString() );
		
	}

	@Override
	public void onEndInstrExecution(Instruction instr, Memory mem,
			OperandStack stack, ProgramCounter pc) {
		
		  System.out.println( "El estado de la máquina tras ejecutar la instrucción es:" );
			
		  printMemory(mem); // Mostramos en pantalla el estado de la memoria
			
		  printStack(stack);  // Mostramos en pantalla el estado de la pila
			
		
	}

	@Override
	public void onHalt() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onReset(ProgramMV program) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStartRun() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onEndRun(boolean aborted) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTrap(Instruction instr, String trapMessage) {
		
		System.err.println( trapMessage );     // Mostramos el mensaje de la excepción.

		
	}
	
	
public static void printMemory(Memory mem) { // Este método muestra por pantalla el estado de la memoria de la máquina virtual
		
		System.out.print( "Memoria:");
		
		if ( mem.isEmpty() ) // Si la memoria está vacía, mostramos por pantalla que está vacía
			System.out.println( " <vacía>");
		 
		else {
			for ( int i = 0; i < mem.getCounter(); i++ ) { // Recorremos el array de objetos de la memoria
				
			    int pos, value;
			    pos = mem.getMemPosition(i); // Obtenemos la posición y el valor de una celda de memoria y lo imprimimos por pantalla
			    value = mem.getMemValue(i);
				System.out.print( " " + "[" + pos + "]" + ":" + value); 
				
			}
			
			System.out.println();
		}
		
	}
	
	
	public static void printStack(OperandStack stack) { // Este método muestra por pantalla el estado de la pila de operandos de la máquina virtual
		
		System.out.print( "Pila de operandos:"); 
		
		if ( stack.isEmpty() ) // Si la pila de operandos está vacía lo mostramos por pantalla
			System.out.println( " <vacía>");
		
		else {
			for ( int i = 0; i < stack.getCounter(); i++ )  // Recorremos el array de la pila de operandos							
				
				System.out.print( " " + stack.getStack(i) ); // Vamos imprimiendo en pantalla los distintos operandos de la pila

		
		    System.out.println();
				
        }
	
	
	}

}
